#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 初始化文件系统模型
    fileSystemModel = new QFileSystemModel(this);
    fileSystemModel->setRootPath(QDir::rootPath());
    ui->treeView->setModel(fileSystemModel);

    //新建文件信号槽
    connect(ui->newFileAction, &QAction::triggered, this, &MainWindow::onNewFileAction);
    //新建窗口
    connect(ui->newFolderAction, &QAction::triggered, this, &MainWindow::onNewWindowAction);

    // 打开连接信号与槽
    connect(ui->openFileAction, &QAction::triggered, this, &MainWindow::openFile);
    connect(ui->openFolderAction, &QAction::triggered, this, &MainWindow::openFolder);

    //文件树点击反应
    connect(ui->treeView, &QTreeView::clicked, this, &MainWindow::onTreeViewClicked);

    //保存文件信号槽
    connect(ui->saveAction, &QAction::triggered, this, &MainWindow::onSaveAction);
    connect(ui->saveAsAction, &QAction::triggered, this, &MainWindow::onSaveAsAction);

    // // 连接文本编辑框的文本变化信号
    // connect(ui->textEdit, &QTextEdit::textChanged, this, &MainWindow::updateMarkdownPreview);

    // 隐藏除名称以外的列
    ui->treeView->setColumnHidden(1, true); // 隐藏大小
    ui->treeView->setColumnHidden(2, true); // 隐藏类型
    ui->treeView->setColumnHidden(3, true); // 隐藏修改日期

}

MainWindow::~MainWindow()
{
    delete ui;
}

//打开文件的槽函数
void MainWindow::openFile()
{
    QString initialPath = getinitialPath();
    QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"), initialPath, tr("所有文件 (*.*)"));

    if (!fileName.isEmpty()) {
        // 显示所选文件内容
        QFile file(fileName);
        if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            QTextStream in(&file);
            ui->textEdit->setPlainText(in.readAll());
            file.close();
        }

        // 显示文件所在目录
        QString dirName = QFileInfo(fileName).absolutePath();
        ui->treeView->setRootIndex(fileSystemModel->setRootPath(dirName));

        //将文件状态转换成打开
        fileOpened = true;
    }
}
//打开文件夹的槽函数
void MainWindow::openFolder()
{
    QString initialPath = getinitialPath();
    QString dirName = QFileDialog::getExistingDirectory(nullptr, QObject::tr("选择文件夹"), initialPath);
    if (!dirName.isEmpty()) {
        // 更新 treeView 显示文件夹内容
        ui->treeView->setRootIndex(fileSystemModel->setRootPath(dirName));

        //将文件状态转换成打开
        fileOpened = true;
    }
}
//获取当前文件位置
QString MainWindow::getinitialPath() {
    QModelIndex currentIndex = ui->treeView->currentIndex();
    if (currentIndex.isValid()) {
        // 如果有有效的选中项，返回其路径
        return fileSystemModel->filePath(currentIndex);
    } else {
        // 如果没有选中项，则返回桌面目录
        return QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
    }
}
//响应md文件
void MainWindow::onTreeViewClicked(const QModelIndex &index)
{
    // 获取所选文件的路径
    QString filePath = fileSystemModel->filePath(index);

    // 检查文件是否是 .md 文件
    if (QFileInfo(filePath).suffix() == "md") {
        QFile file(filePath);
        if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            QTextStream in(&file);
            ui->textEdit->setPlainText(in.readAll());

            //将文件状态转换成打开
            fileOpened = true;

            file.close();
        } else {
            QMessageBox::warning(this, tr("打开文件失败"), tr("无法打开文件: %1").arg(filePath));
        }
    }
}
//新建文件
void MainWindow::onNewFileAction()
{
    QString initialPath = getinitialPath();
    QString fileName = QFileDialog::getSaveFileName(this, tr("新建文件"), initialPath, tr("文本文件 (*.txt);;Markdown 文件 (*.md);;所有文件 (*.*)"));

    if (!fileName.isEmpty()) {

        if (QFileInfo(fileName).suffix().isEmpty()) {
            fileName += ".md";
        }

        QFile file(fileName);
        if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
            file.close(); // 创建空文件
            QMessageBox::information(this, tr("新建文件"), tr("文件 %1 创建成功。").arg(fileName));
        } else {
            QMessageBox::warning(this, tr("创建文件失败"), tr("无法创建文件: %1").arg(fileName));
        }
    }
}
// 新建窗口
void MainWindow::onNewWindowAction()
{
    // 创建一个新的 MainWindow 实例
    MainWindow *newWindow = new MainWindow();

    // 显示新窗口
    newWindow->show();
}

// 保存槽函数
void MainWindow::onSaveAction()
{
    QString currentFilePath = getinitialPath();

    if (!currentFilePath.isEmpty()) {
        // 保存文件到 currentFilePath
        saveFile(currentFilePath);
    } else {
        // 如果当前文件没有保存过，调用另存为
        onSaveAsAction();
    }
}

// 另存为槽函数
void MainWindow::onSaveAsAction()
{
    // 这里实现另存为文件的操作
    QString fileName = QFileDialog::getSaveFileName(this, tr("另存为"), "", tr("Markdown 文件 (*.md);;所有文件 (*)"));
    if (!fileName.isEmpty()) {
        // 保存文件到新路径
        saveFile(fileName);
    }
}

// 保存文件到指定路径的函数
void MainWindow::saveFile(const QString &filePath)
{
    // 这里实现将文件内容保存到 filePath 的逻辑
    // 假设你有一个 QTextEdit *editor 用来编辑文本
    QFile file(filePath);
    if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        QTextStream out(&file);
        out << ui->textEdit->toPlainText();
        file.close();
        // 更新当前文件路径
        currentFilePath = filePath;
    } else {
        QMessageBox::warning(this, tr("保存文件"), tr("无法保存文件: %1").arg(filePath));
    }
}
